Index services by the users uid, disconnect agents if the service is
made private

Dominik Sander лет %!s(int64=9): %!d(string=назад)
Родитель
Сommit
34775f902a
5 измененных файлов с 55 добавлено и 12 удалено
  1. 6 4
      app/models/service.rb
  2. 7 0
      db/migrate/20140811200922_add_uid_column_to_services.rb
  3. 7 1
      db/schema.rb
  4. 6 0
      spec/fixtures/agents.yml
  5. 29 7
      spec/models/service_spec.rb

+ 6 - 4
app/models/service.rb

@@ -1,7 +1,7 @@
1 1
 class Service < ActiveRecord::Base
2 2
   PROVIDER_TO_ENV_MAP = {'37signals' => 'THIRTY_SEVEN_SIGNALS'}
3 3
 
4
-  attr_accessible :provider, :name, :token, :secret, :refresh_token, :expires_at, :global, :options
4
+  attr_accessible :provider, :name, :token, :secret, :refresh_token, :expires_at, :global, :options, :uid
5 5
 
6 6
   serialize :options, Hash
7 7
 
@@ -15,8 +15,8 @@ class Service < ActiveRecord::Base
15 15
   scope :available_to_user, lambda { |user| where("services.user_id = ? or services.global = true", user.id) }
16 16
   scope :by_name, lambda { |dir = 'desc'| order("services.name #{dir}") }
17 17
 
18
-  def disable_agents
19
-    agents.each do |agent|
18
+  def disable_agents(conditions = {})
19
+    agents.where.not(conditions).each do |agent|
20 20
       agent.service_id = nil
21 21
       agent.disabled = true
22 22
       agent.save!(validate: false)
@@ -24,6 +24,7 @@ class Service < ActiveRecord::Base
24 24
   end
25 25
 
26 26
   def toggle_availability!
27
+    disable_agents(user_id: self.user_id) if global
27 28
     self.global = !self.global
28 29
     self.save!
29 30
   end
@@ -76,9 +77,10 @@ class Service < ActiveRecord::Base
76 77
   def self.initialize_or_update_via_omniauth(omniauth)
77 78
     options = provider_specific_options(omniauth)
78 79
 
79
-    find_or_initialize_by(provider: omniauth['provider'], name: options[:name]).tap do |service|
80
+    find_or_initialize_by(provider: omniauth['provider'], uid: omniauth['uid'].to_s).tap do |service|
80 81
       service.assign_attributes token: omniauth['credentials']['token'],
81 82
                                 secret: omniauth['credentials']['secret'],
83
+                                name: options[:name],
82 84
                                 refresh_token: omniauth['credentials']['refresh_token'],
83 85
                                 expires_at: omniauth['credentials']['expires_at'] && Time.at(omniauth['credentials']['expires_at']),
84 86
                                 options: options

+ 7 - 0
db/migrate/20140811200922_add_uid_column_to_services.rb

@@ -0,0 +1,7 @@
1
+class AddUidColumnToServices < ActiveRecord::Migration
2
+  def change
3
+    add_column :services, :uid, :string
4
+    add_index :services, :uid
5
+    add_index :services, :provider
6
+  end
7
+end

+ 7 - 1
db/schema.rb

@@ -11,7 +11,10 @@
11 11
 #
12 12
 # It's strongly recommended that you check this file into your version control system.
13 13
 
14
-ActiveRecord::Schema.define(version: 20140809211540) do
14
+ActiveRecord::Schema.define(version: 20140811200922) do
15
+
16
+  # These are extensions that must be enabled in order to support this database
17
+  enable_extension "plpgsql"
15 18
 
16 19
   create_table "agent_logs", force: true do |t|
17 20
     t.integer  "agent_id",                      null: false
@@ -128,8 +131,11 @@ ActiveRecord::Schema.define(version: 20140809211540) do
128 131
     t.text     "options"
129 132
     t.datetime "created_at"
130 133
     t.datetime "updated_at"
134
+    t.string   "uid"
131 135
   end
132 136
 
137
+  add_index "services", ["provider"], name: "index_services_on_provider", using: :btree
138
+  add_index "services", ["uid"], name: "index_services_on_uid", using: :btree
133 139
   add_index "services", ["user_id", "global"], name: "index_accounts_on_user_id_and_global", using: :btree
134 140
 
135 141
   create_table "user_credentials", force: true do |t|

+ 6 - 0
spec/fixtures/agents.yml

@@ -115,3 +115,9 @@ bob_basecamp_agent:
115 115
   user: bob
116 116
   service: generic
117 117
   guid: <%= SecureRandom.hex %>
118
+
119
+jane_basecamp_agent:
120
+  type: Agents::BasecampAgent
121
+  user: jane
122
+  service: generic
123
+  guid: <%= SecureRandom.hex %>

+ 29 - 7
spec/models/service_spec.rb

@@ -5,13 +5,32 @@ describe Service do
5 5
     @user = users(:bob)
6 6
   end
7 7
 
8
-  it "should toggle the global flag" do
9
-    @service = services(:generic)
10
-    @service.global.should == false
11
-    @service.toggle_availability!
12
-    @service.global.should == true
13
-    @service.toggle_availability!
14
-    @service.global.should == false
8
+  describe "#toggle_availability!" do
9
+    it "should toggle the global flag" do
10
+      @service = services(:generic)
11
+      @service.global.should == false
12
+      @service.toggle_availability!
13
+      @service.global.should == true
14
+      @service.toggle_availability!
15
+      @service.global.should == false
16
+    end
17
+
18
+    it "disconnects agents and disables them if the previously global service is made private again", focus: true do
19
+      agent = agents(:bob_basecamp_agent)
20
+      jane_agent = agents(:jane_basecamp_agent)
21
+
22
+      service = agent.service
23
+      service.toggle_availability!
24
+      service.agents.length.should == 2
25
+
26
+      service.toggle_availability!
27
+      jane_agent.reload
28
+      jane_agent.service_id.should be_nil
29
+      jane_agent.disabled.should be true
30
+
31
+      service.reload
32
+      service.agents.length.should == 1
33
+    end
15 34
   end
16 35
 
17 36
   it "disables all agents before beeing destroyed" do
@@ -74,6 +93,7 @@ describe Service do
74 93
       }.to change { @user.services.count }.by(1)
75 94
       service = @user.services.first
76 95
       service.name.should == 'johnqpublic'
96
+      service.uid.should == '123456'
77 97
       service.provider.should == 'twitter'
78 98
       service.token.should == 'a1b2c3d4...'
79 99
       service.secret.should == 'abcdef1234'
@@ -88,6 +108,7 @@ describe Service do
88 108
       service.provider.should == '37signals'
89 109
       service.name.should == 'Dominik Sander'
90 110
       service.token.should == 'abcde'
111
+      service.uid.should == '12345'
91 112
       service.refresh_token.should == 'fghrefresh'
92 113
       service.options[:user_id].should == 12345
93 114
       service.expires_at = Time.at(1401554352)
@@ -101,6 +122,7 @@ describe Service do
101 122
       service = @user.services.first
102 123
       service.provider.should == 'github'
103 124
       service.name.should == 'dsander'
125
+      service.uid.should == '12345'
104 126
       service.token.should == 'agithubtoken'
105 127
     end
106 128
   end